# 1.生成宠物
#   随机昵称、随机品种、随机体力、随机心情值
# 2.喂食
#   选择一种食物【1.零食 2.xxx粮】
#   输出xxx吃了xxx，如果体力高于xxx有对应提示
#   增加体力，如果高于xxx，提示吃饱了
# 3.玩耍
#   选择一个玩具【1.xx 2.yyy】
#   判断体力是否充沛，玩耍后增加心情值，减少体力，如果体力不足有对应提示
#   输出xxx正在玩xxx， 显示当前心情值和体力
#   增加生命值，如果高于xxx，提示吃饱了
# 4.当前信息
#   输出 我叫xx，是一只xxx，当前心情好，不饿
import json
import os.path
import random


# 宠物类
class Pet:
    # 构造函数中定义属性
    #   昵称 品种 体力 心情
    def __init__(self, name, type, hp=None, mood=None):
        self.name = name
        self.type = type
        # 如果hp和mood传值则使用，没有则随机生成
        self.hp = hp if hp is not None else random.randint(80, 99)
        self.mood = mood if mood else random.randint(80, 99)

    # 输出信息
    # def info(self):
    #     print(f"我是一只{self.type}，名叫{self.name}，当前体力：{self.hp}，当前精力：{self.mood}")

    # pet=Pet()   print(pet)  如果没有__str__函数，
    # 默认输出<__main__.Pet object at 0x0000027172EE6B10>  表示它的类型和内存地址
    # 如果有__str__函数，就会自动调用。所以通常在__str__函数中返回对象的属性们
    # 魔术/魔法函数  :用__xxx__命名的函数
    # def __str__(self):
    #     return f"name: {self.name}, type: {self.type}, hp: {self.hp}, mood: {self.mood}"

    # __repr__可以代替__str__。
    # 尤其是在输出一组对象的时候，会自动调用__repr__
    def __repr__(self):
        return f"我是一只{self.type}，名叫{self.name}，当前体力：{self.hp}，当前精力：{self.mood}"

    # 将对象转换为json对象(属性字典)  可以使用`对象.__dict__`代替
    # def to_json(self):
    #     return {
    #         "name": self.name,
    #         "type": self.type,
    #         "hp": self.hp,
    #         "mood": self.mood
    #     }

    # 吃
    def eat(self, food):
        if self.hp > 90:
            inp = input("当前体力已经很高了，是否还要继续投喂(Y/N)")
            if inp == 'N' or inp == 'n':
                return
        print(f"{self.name}正在吃{food}")
        self.hp += 10

    # 玩
    def play(self, toy):
        if self.hp < 60:
            inp = input("当前体力已经很低了，是否还要继续玩耍(Y/N)")
            if inp == 'N' or inp == 'n':
                return
        print(f"{self.name}正在玩{toy}")
        self.hp -= 10
        self.mood += 10


# 点击宠物机
# 行为
# 生成宠物  喂食  玩耍  当前信息
class Tamagotchi:
    # 在构造函数中定义了当前宠物对象和其信息json文件
    def __init__(self):
        self.pet = None
        self.pet_info_path = "pet_info.json"
        if os.path.exists(self.pet_info_path):
            # 读取现有json文件
            with open(self.pet_info_path, "r", encoding="utf-8") as file:
                data = json.load(file)
                self.pet = Pet(data['name'], data['type'], data['hp'], data['mood'])

    def write_to_json(self):
        print("正在更新宠物数据。。。")
        # 将当前宠物信息写为json文件
        with open(self.pet_info_path, "w", encoding="utf-8") as file:
            # 完整写法，将对象写到json文件中时，写入的对象必须是{k:v}格式的字典对象
            # json.dump({
            #     "name": self.pet.name,
            #     "type": self.pet.type,
            #     "hp": self.pet.hp,
            #     "mood": self.pet.mood
            # }, file)
            # 相当于
            # json.dump(self.pet.to_json(), file)
            # 相当于
            json.dump(self.pet.__dict__, file)
        print("更新成功！")

    # 创建宠物
    def create_pet(self):
        # 名字和类型的列表
        type_list = ['小狗', '小猫', '鹦鹉', '蜥蜴', '蜘蛛']
        name_list = ['小汪', '小喵', '小五', '小西', '小珠']
        # 随机名字和类型
        type = random.choice(type_list)
        name = random.choice(name_list)
        # 如果已经生成过宠物，会有json文件存在
        if self.pet:
            inp = input("当前已有宠物存在，是否重新生成(Y/N)")
            if inp == "N" or inp == 'n':
                return
        # 重新生成
        self.pet = Pet(name, type)
        self.write_to_json()

    def say_hello(self):
        if self.pet:
            # 当前已经存在__repr__函数，可以直接输出对象。
            print(self.pet)
            self.pet.hp -= 5
            self.pet.mood -= 5
        else:
            print("请先生成宠物")

    # 宠物喂养
    def feed(self):
        food_list = ['虫子', '磨牙棒', '冻干', '饲料']
        for idx, food in enumerate(food_list):
            print(idx + 1, food)
        idx = int(input("请选择要投喂的食物"))
        food = food_list[idx - 1]
        self.pet.eat(food)
        self.write_to_json()

    # 宠物玩耍
    def play_with_pet(self):
        toy_list = ['盘子', '冒险团', '小球', '玩具']
        for idx, toy in enumerate(toy_list):
            print(idx + 1, toy)
        idx = int(input("请选择要玩耍的玩具"))
        toy = toy_list[idx - 1]
        self.pet.play(toy)
        self.write_to_json()

    def menu(self):
        print("1.生成宠物")
        print("2.自我介绍")
        print("3.投喂宠物")
        print("4.宠物玩耍")
        inp = int(input("请选择"))
        if inp == 1:
            self.create_pet()
        elif inp == 2:
            self.say_hello()
        elif inp == 3:
            self.feed()
        elif inp == 4:
            self.play_with_pet()
        self.menu()


if __name__ == '__main__':
    tamagotchi = Tamagotchi()
    tamagotchi.menu()
